package com.qiguliuxing.dts.service.system;

import com.qiguliuxing.dts.core.redis.RedisServiceUtil;
import com.qiguliuxing.dts.db.domain.DtsSystem;
import com.qiguliuxing.dts.service.base.DtsSystemConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.List;

/**
 * 该类用于自动初始化数据库配置到BaseConfig中，以便BaseConfig的子类调用
 */
@Component
class ConfigService {
	private static ConfigService systemConfigService;

	@Autowired
	private DtsSystemConfigService dtsSystemConfigService;

	/**
	 * 此类 @PostConstruct注解使用到了RedisServiceUtil，必须等RedisServiceUtil先构造完
	 * 由于@PostConstruct 构造是随机机制，可能会导致使用RedisServiceUtil空指针异常
	 * 此处虽然没被用到但是必须注解，使RedisServiceUtil优先于此类@PostConstruct
	 */
	@Autowired
	private RedisServiceUtil redisServiceUtil;

	/**
	 * 不允许实例化
	 */
	private ConfigService() {
	}

	static ConfigService getSystemConfigService() {
		return systemConfigService;
	}

	@PostConstruct
	public void inist() {
		systemConfigService = this;
		systemConfigService.initConfigs();
	}

	/**
	 * 根据 prefix 重置该 prefix 下所有设置
	 *
	 * @param prefix
	 */
	public void reloadConfig(String prefix) {
		List<DtsSystem> list = dtsSystemConfigService.queryAll();
		for (DtsSystem item : list) {
			// 符合条件，添加
			if (item.getKeyName().startsWith(prefix)) {
				BaseConfig.addConfig(item.getKeyName(), item.getKeyValue());
			}
		}
	}

	/**
	 * 读取全部配置
	 */
	private void initConfigs() {
		List<DtsSystem> list = dtsSystemConfigService.queryAll();
		for (DtsSystem item : list) {
			BaseConfig.addConfig(item.getKeyName(), item.getKeyValue());
		}
	}
}